#pragma once
#include <ctime>
#include <string>
#include <sys/stat.h>
#include <iostream>
using std::string;

namespace mylog
{
    namespace util
    {
        class Time // 时间类
        {
        public:
            static size_t GetTime() // 获取当前时间的函数，返回值是size_t
            {
                return (size_t)time(nullptr);
            }
        };
        class File // 文件类，用于判断文件是否存在
        {
        public:
            static bool Exists(const std::string &pathname);     // 判断文件是否存在的函数
            static string GetPath(const std::string &pathname);  // 获取文件路径的函数
            static void CreateDirectory(const string &pathname); // 创建目录的函数
        };
        bool File::Exists(const std::string &pathname)
        {
            struct stat st;
            if (stat(pathname.c_str(), &st) < 0)
            {
                return false;
            }
            return true;
        }
        string File::GetPath(const std::string &pathname)
        {
            // abc.cpp
            size_t pos = pathname.find_last_of("/\\");
            if (pos == string::npos) // 没有找到的情况
            {
                return ".";
            }
            else
            {
                return pathname.substr(0, pos + 1);
            }
        }
        void File::CreateDirectory(const string &pathname) // 创建目录的函数
        {
            // 一层一层创建
            //  abc/bcd/ced
            size_t pos = 0; // 找到的位置
            size_t idx = 0; // 反复查找的位置（会变化）
            while (idx < pathname.size())
            {
                pos = pathname.find_first_of("/\\", idx);
                if (pos == string::npos) // 从一开始就没有找到‘\’的情况，直接创建目录
                {
                    // abc
                    mkdir(pathname.c_str(), 0777);
                    return;
                }
                if (pos == idx)
                {
                    idx = pos + 1;
                    continue;
                }
                std::string subdir = pathname.substr(0, pos);
                if (subdir == "." || subdir == "..")
                {
                    idx = pos + 1;
                    continue;
                }
                if (Exists(subdir))
                {
                    idx = pos + 1;
                    continue;
                }
                mkdir(subdir.c_str(), 0755);
                idx = pos + 1;
            }
        }
    }
}